這一切看似美好的機制下藏有一些缺陷,想像一個Process區要去存取一個記憶體位置的值,需要先撈出page table,找到page內對應的值,再去存取實際的記憶體位置,以這樣的方法光是一個普通的操作就需要兩次的記憶體存取,第一次去讀page table,第二才是去讀真實要的資料。直接影響了一倍的效能,很有可能會讓系統的效能卡在記憶體的操作上。
解決這個問題的方法是透過硬體設備 - Translation Look-aside Buffer(TLB),不論是在搜尋還是存取都非常快速的cache裝置,使用的概念非常簡單,將查過的資料都先儲存在TLB之上(某個page對應到哪個frame),當CPU要去存取記憶體之前會先透過TLB查詢,如果TLB上已經有快取就直接拿到了page跟frame的關聯性,省去一次讀取記憶體的時間。
跟所有的儲存設備一樣,越快的設備容量就越小、造價也越貴,因此TLB裡面能存的快取空間也不會太大,且TLB是與所有的Process一起共用的,因此在context switch之後,需要讀取的page table換了之後cache當然也沒用了,所以TLB基本上都會清空。
另外一個潛藏的危機是因為現現代的硬體設備越來越好,程式越來越大,page table的長度也跟著變得非常大,若用一個陣列的方式去儲存page table,則會需要很多連續又大的空間(有多少個process就有多少個),為了解決這個問題,就針對page table的結構下功夫做變化。